# -*- coding: utf-8 -*-
# 作   者 ：许亦安
# 邮   箱 ：xuyian_dev@foxmail.com
# 创建时间 ：2020/10/22  17:53
# 项目名称 ：HFYG
# 文件名称 ：GetBySelenium.py
# 开发工具 ：PyCharm

# 导入模块
import xlwt
from selenium import webdriver
import time
# from tkinter import *
# import tkinter.filedialog
import xlrd
import os

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

# 考生账密文件路径
stu_xlsx_path = "./data/考生账密.xlsx"
stu_xls_path = "./data/考生账密.xls"
# 查询结果存放路径
result_path = "./data/考生分数查询结果.xls"
# 图片文件夹路径
img_path = "./data/img/"
# 网址
url = 'http://zk.ahzsks.cn/'


# 取文件
def file_isexist(path):
    # 判断账密文件是否存在
    if os.path.exists(path):
        # 存在
        return True
    else:
        # 不存在
        return False


if __name__ == '__main__':
    start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    if not file_isexist(stu_xls_path):
        print("账密文件不存在，先把  \'考生账密.xlsx\'  放在data文件夹内。")
        exit(0)
    # 获取账密表
    sheet = xlrd.open_workbook(stu_xls_path).sheet_by_index(0)
    # 获取总行数
    total_row = sheet.nrows
    # 创建结果文件
    workbook = xlwt.Workbook(encoding='utf-8')
    zc_sheet = workbook.add_sheet('正常', cell_overwrite_ok=True)
    yc_sheet = workbook.add_sheet('异常', cell_overwrite_ok=True)
    # 写正常表头
    zc_sheet.write(0, 0, "准考证号")
    zc_sheet.write(0, 1, "身份证号")
    zc_sheet.write(0, 2, "姓名")
    zc_sheet.write(0, 3, "课程代码")
    zc_sheet.write(0, 4, "课程名称")
    zc_sheet.write(0, 5, "考试成绩")
    zc_sheet.write(0, 6, "课程学分")
    zc_sheet.write(0, 7, "考试时间")

    # 写异常表头
    yc_sheet.write(0, 0, "准考证号")
    yc_sheet.write(0, 1, "身份证号")
    yc_sheet.write(0, 2, "姓名")
    yc_sheet.write(0, 3, "课程代码")

    workbook.save(result_path)

    # 行号游标
    zc_cursor = 1
    yc_cursor = 1

    # 创建浏览器对象
    driver = webdriver.Firefox()
    # 打开登录页
    driver.get(url)
    for i in range(1, total_row):
    # for i in range(1, 11):
        # 准考证，密码
        user_id = sheet.row_values(i)[0]
        password = sheet.row_values(i)[1]
        sfz = sheet.row_values(i)[2]
        name = sheet.row_values(i)[3]
        print("第" + str(i) + "次访问---起始时间：" + start_time
              + "---当前时间：" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
              + "---准考证号：" + user_id + "---身份证号：" + sfz + "---姓名：" + name)
        # 等待加载，限时60秒
        driver.implicitly_wait(60)
        # 账号
        driver.find_element_by_xpath('//*[@id="txtAdmissionTicket"]').send_keys(user_id)
        # 密码
        driver.find_element_by_xpath('//*[@id="txtPassWord"]').send_keys(password)
        # 获取验证码
        text = driver.find_element_by_xpath('//*[@id="lblTest"]').text
        # 填写验证码
        driver.find_element_by_xpath('//*[@id="txtTest"]').send_keys(text)
        # 登录
        driver.find_element_by_xpath('//*[@id="btnLogin"]').click()
        # 等待加载，限时60秒
        driver.implicitly_wait(60)

        # 判断账号密码是否正确，不正确会弹出弹窗
        is_present_ = EC.alert_is_present()(driver)
        if is_present_:
            print(is_present_.text)
            yc_sheet.write(yc_cursor, 0, user_id)
            yc_sheet.write(yc_cursor, 1, sfz)
            yc_sheet.write(yc_cursor, 2, name)
            yc_sheet.write(yc_cursor, 3, is_present_.text)
            yc_cursor += 1
            workbook.save(result_path)
            is_present_.accept()
            # 重新打开登录页，否则验证码不刷新
            driver.get(url)
            continue

        # 点击2003年之后成绩
        driver.find_element_by_xpath(
            '/html/body/form/div[3]/div[1]/div[3]/table/tbody/tr'
            + '/td[2]/div/div/div[3]/table[2]/tbody/tr/td[3]/a/font').click()
        # 等待加载，限时60秒
        driver.implicitly_wait(60)
        # 到分数frame
        driver.switch_to.frame("ifMain")
        # 等待加载，限时60秒
        driver.implicitly_wait(60)

        # 获取总行数，包括表头
        rows = driver.find_element_by_class_name('gridview_m').find_elements_by_css_selector('tr')
        # 如果只有三行数据且第三行数据只有一列，则没有分数数据
        if len(rows) == 3 and len(rows[2].find_elements_by_css_selector('td')) == 1:
            print("没有数据")
            yc_sheet.write(yc_cursor, 0, user_id)
            yc_sheet.write(yc_cursor, 1, sfz)
            yc_sheet.write(yc_cursor, 2, name)
            yc_sheet.write(yc_cursor, 3, "没有数据")
            yc_cursor += 1
        else:
            print(str(len(rows)-1) + "条数据")
            for row in range(1, len(rows)):
                # 获取分数
                item = rows[row].find_elements_by_css_selector('td')
                # print(item[0].text + "---" + item[1].text + "---" + item[2].text + "---" + item[3].text + "---" + item[4].text)
                # 写到文件
                zc_sheet.write(zc_cursor, 0, user_id)
                zc_sheet.write(zc_cursor, 1, sfz)
                zc_sheet.write(zc_cursor, 2, name)
                zc_sheet.write(zc_cursor, 3, item[0].text)
                zc_sheet.write(zc_cursor, 4, item[1].text)
                zc_sheet.write(zc_cursor, 5, item[2].text)
                zc_sheet.write(zc_cursor, 6, item[3].text)
                zc_sheet.write(zc_cursor, 7, item[4].text)
                zc_cursor += 1
        workbook.save(result_path)
        # 返回主文档
        driver.switch_to.default_content()
        # 保存截图
        driver.save_screenshot("./data/img/" + user_id + "-" + name + '.png')
        # 退出
        driver.find_element_by_xpath('//*[@id="btnOut"]').click()
